Site cover image

Site icon imageSen(Qian)’s Memo

This website is Donglin Qian (Torin Sen)’s memo, especially about machine learning papers and competitive programming.

2020-NIPS-[FixMatch]Simplifying Semi-Supervised Learning with Consistency and Confidence

https://arxiv.org/abs/2001.07685

あまりに解説の出来が良さすぎる日本語のQiita記事があるので、これを読む前提で、自分がわからなかった点だけメモする。

https://qiita.com/AmethysT/items/0fee904aeca06c2ae5cf

SONYのいい動画。

Pseudo Labelが満たしてほしい条件

Self-supervised Learningにおける、Pseudo Labelの付与して、それをground truthとして扱って学習するのはよく見る話である。

Pseudo Labelに限らず、Labelに満たしてほしい性質は以下の通り。

  1. 似ているデータは同じラベルを持つ。
    1. クラスタ仮定、平滑化仮定とも呼ばれる。
  2. 識別境界はデータの近くを通らない。
    1. データのない低密度な領域に識別境界が存在している。

これを考慮すると、Pseudo Labelが満たしてほしいのは以下のような条件である。

  1. Entropy Minimization
    1. エントロピーが小さい=明確にクラス分布がわかる
  2. Consistency Regularization
    1. モデルの入力は多少変わっていても、同じPseudo Labelであるべき。

FixMatchにおいての実現

FixMatchでも、Consistency Regularizationは考えている。この手法では、弱いデータ拡張と強いデータ拡張という2つの概念を提唱している。

記号の説明

  • LabeledのデータセットX={(xi,yi)}i=1BX= \{ (\mathbf{x}_i, \mathbf{y}_i) \}_{i=1}^{B} ラベルはone-hot。
  • UnlabeledのデータセットU={(ui)}i=1μBU= \{ (\mathbf{u}_i) \}_{i=1}^{\mu B}
  • LLクラス分類で、バッチサイズはBBX,UX, Uのデータ数の比はμ\mu
  • pm(yx)p_m(\mathbf{y} | \mathbf{x})識別器による予測分布。
  • H(p,q)H(p,q)確率分布の間のクロスエントロピー。
  • A()A()は強いデータ拡張。α()\alpha()は弱いデータ拡張
    • 先行研究では、α()\alpha()はVAT(仮想的な敵対訓練)、指数移動平均などの変換であった。

Related Work

ラベルなしデータの損失関数は以下のようにあらわすことができる。ここで、α\alphaは変換であり、pmp_mが予測したデータ分布である。これらはすべて非決定的であり、分布の中からのサンプリングである、と考えられる。

L=b=1μBpm(yα(ub))pm(yα(ub))22L = \sum_{b=1} ^ {\mu B} || p_m(y | \alpha(\mathbf{u}_b)) - p_m(y | \alpha(\mathbf{u}_b)) ||_2 ^2

そして、Pseudo Label付与の基準としては、一定の閾値τ\tauを、予測結果p(yx)p(\mathbf{y}|\mathbf{x})の最大の成分が超えたら付与するということになる。

提案手法

損失はXXについてのものと、UUについてのもの両方を計算する。

  1. UUのデータに弱いデータ拡張α()\alpha()を施して、それの識別器のクラスの予測ハードラベルq^b\hat{q}_bを得る。
qb=pm(yα(ui)),q^b=arg maxqb\mathbf{q}_b = p_m(\mathbf{y}|\alpha(\mathbf{u}_i)) , \hat{q}_b = \argmax \mathbf{q}_b
  1. このq^b\hat{q}_bをPseudo Labelとして、ub\mathbf{u}_bに付与する。
  2. 次に、同じub\mathbf{u}_bに対して、強いデータ拡張A()A()を施して、予測し、先ほどの弱い拡張によるPseudo Labelとのクロスエントロピー誤差を計算する。
Lu=1μBi=1μB1[max(qb)>τ]H(q^b,pm(yA(ub)))L_u = \frac{1}{ \mu B} \sum_{i=1}^{\mu B} \mathbf{1}[\max(\mathbf{q}_b) > \tau] H(\hat{\mathbf{q}}_b, p_m(y|A(\mathbf{u}_b)))
  1. XXのデータに与えられたラベルについて、普通に損失を計算する。
Ls=1Bi=1BH(yb,pm(yx))L_s = \frac{1}{B} \sum_{i=1}^B H (\mathbf{y}_b, p_m(\mathbf{y}|\mathbf{x}))
  1. 全体の損失関数はハイパーパラメタλ\lambdaによって以下のように得ることができる。
L=Ls+λLuL = L_s + \lambda L_u

強い、弱いデータ拡張とは何なのか

弱いデータ拡張は、

  • 50%の確率で左右を反転させる。
  • 画像を上下左右にランダムに移動させる。動かす量は画像の縦横のそれぞれ12.5%以内である。

強いデータ拡張は、Python Imaging Libraryに定義されている以下の動作を使う。(GPT先生曰く)

  • 回転(Rotation)
    • 画像を指定された角度だけ回転させます。
    • 例:Image.rotate(angle)
  • シアー(Shear)
    • 画像を斜め方向に引き伸ばします。
    • 例:Image.transform((width, height), Image.AFFINE, (1, shear, 0, 0, 1, 0))
  • コントラスト調整(Contrast Adjustment)
    • 画像のコントラストを調整します。
    • 例:ImageEnhance.Contrast(image).enhance(factor)
  • 明るさ調整(Brightness Adjustment)
    • 画像の明るさを調整します。
    • 例:ImageEnhance.Brightness(image).enhance(factor)
  • 彩度調整(Saturation Adjustment)
    • 画像の色の鮮やかさを調整します。
    • 例:ImageEnhance.Color(image).enhance(factor)
  • ぼかし(Blur)
    • 画像にぼかし効果を適用します。
    • 例:Image.filter(ImageFilter.BLUR)
  • シャープ化(Sharpen)
    • 画像をシャープにします。
    • 例:Image.filter(ImageFilter.SHARPEN)
  • ソーラライズ(Solarize)
    • 画像のピクセル値を反転します。
    • 例:ImageOps.solarize(image, threshold)
  • ポスタライズ(Posterize)
    • 画像のビット数を減らし、色の階調を粗くします。
    • 例:ImageOps.posterize(image, bits)
  • 等高線抽出(Equalize)
    • 画像のヒストグラムを平坦化してコントラストを均一にします。
    • 例:ImageOps.equalize(image)
  • インバート(Invert)
    • 画像の色を反転させます。
    • 例:ImageOps.invert(image)
  • ランダムクロップ(Random Crop)
    • 画像をランダムに切り取ります。
    • 例:ImageOps.crop(image, border)

どのように組み合わせるかについて、

  1. 強化学習ベースの手法AutoAugment。これは強化学習で、どの組み合わせが優秀なのかを決めている。
  2. ランダムなRandAugment, (謎)CTAugmentを使用している。

また、他に単独にCutoutという一部の画像を黒い■で塗りつぶすものもある。

他との組み合わせ

この手法自体はVAT、移動指数平均などほかの手法と簡単に組み合わせることができる。

実験結果

抜群によかったぜ。